# TODO: 导入必要的库和模块
import pickle
import gradio as gr
import numpy as np
from sklearn.preprocessing import MinMaxScaler
# TODO: 加载保存的KNN模型，这样我们可以使用预训练的模型进行预测
with open ("best_knn_model.pkl" , '+rb') as f:
    knn_model = pickle.load(f)

# TODO: 定义预测函数，这个函数将用于Gradio接口进行预测
def predict_digit(image):
    # 预处理图像，将其转换为模型预测所需的形式
    
    image = image.convert('L')  # 转换为灰度图
    image = image.resize((8, 8))  # 调整图像大小
    image_array = np.array(image).flatten()  # 将图像转换为一维数组
    print(image_array.max())
    print(image_array.min())
    image_array = (image_array / 255.0).reshape(1, -1)  # 归一化并重塑为模型输入的形状
    print("1",image_array.max())
    print("2",image_array.min())
    prediction = knn_model.predict(image_array)  # 使用模型进行预测
    print(prediction)
    return prediction[0]

# TODO: 创建Gradio接口，这个接口将用于用户输入和显示预测结果
with gr.Blocks() as app:
    with gr.Row():
        sketchpad = gr.Sketchpad(label="绘制数字", type="pil")
        output_label = gr.Label(label="预测结果")
    
    with gr.Row():
        submit_button = gr.Button("预测数字")
        # 当用户点击预测按钮时，调用 predict_digit 函数进行预测
    submit_button.click(
        fn=predict_digit,
        inputs=sketchpad,
        outputs=output_label
    )

# TODO: 启动Gradio接口，用户可以通过这个接口进行交互
app.launch()
